public class TArbolBB implements IArbolBB {

	public static final String SEPARADOR_ELEMENTOS_IMPRESOS = "-";
	public IElementoAB raiz;

	public TArbolBB() {
		raiz = null;
	}

	@Override
	public boolean esVacio() {
		return (raiz == null);
	}

	@Override
	public boolean insertar(IElementoAB elemento) {
		if (elemento == null) {
			return false;
		}
		if (esVacio()) {
			raiz = elemento;
			return true;
		} else {
			return raiz.insertar(elemento);
		}
	}

	@SuppressWarnings("rawtypes")
	public boolean insertar(Comparable unaEtiqueta, Object unosDatos) {
		if (unaEtiqueta == null) {
			return false;
		}
		TElementoAB elemento = new TElementoAB(unaEtiqueta, unosDatos);
		return insertar(elemento);
	}

	@Override
	public String inOrden() {
		String resultado = " ";
		if (esVacio()) {
			return null;
		} else {
			resultado = raiz.inOrden();
		}
		return resultado.substring(0, resultado.length() - 1);
	}

	@Override
	public String preOrden() {
		String resultado = " ";
		if (esVacio()) {
			return null;
		} else {
			resultado = raiz.preOrden();
		}
		return resultado.substring(0, resultado.length() - 1);
	}

	@Override
	public String postOrden() {
		String resultado = " ";
		if (esVacio()) {
			return null;
		} else {
			resultado = raiz.postOrden();
		}
		return resultado.substring(0, resultado.length() - 1);
	}

	@SuppressWarnings("rawtypes")
	@Override
	public IElementoAB buscar(Comparable unaEtiqueta) {
		if (unaEtiqueta == null) {
			return null;
		} else {
			if (esVacio()) {
				return null;
			} else {
				return raiz.buscar(unaEtiqueta);
			}
		}
	}

	@Override
	public int obtenerAltura() {
		int nivel = -1;
		if (esVacio()) {
			return nivel;
		} else {
			return raiz.obtenerAltura();
		}
	}

	public IElementoAB eliminar(Comparable etiqueta) {
		if (etiqueta == null) {
			return null;
		} else {
			return raiz = raiz.eliminar(etiqueta);
		}
	}

	public int obtenerTamano() {
		if (raiz == null) {
			return 0;
		} else {
			return raiz.obtenerTamano();
		}
	}

	public int obtenerCantidadHojas() {
		if (raiz == null) {
			return 0;
		} else {
			int cantHojas = (raiz.obtenerTamano() + 1) / 2;
			return cantHojas;
		}
	}

	public int obtenerNodosInternos() {
		if (raiz == null) {
			return 0;
		} else {
			int tamanio = raiz.obtenerTamano();
			int cantNodosInt = tamanio - (tamanio + 1) / 2;
			return cantNodosInt;
		}
	}

	public int obtenerNodosNivel(int nivel) {
		if (raiz == null) {
			return 0;
		} else {
			if (nivel == 0) {
				return 1;
			} else {
				return raiz.obtenerNodosNivel(0, nivel);
			}
		}
	}

	public boolean esArbolBinario(){
		if(raiz == null){
			return true;
		}else{
			return raiz.esArbolBinario();
		}
	}
	
	public String hojasMayorMenor(){
		if(raiz == null){
			return null;
		}else{
			String resultado = raiz.hojasMayorMenor();
			return resultado.substring(0, resultado.length() - 1);
		}
	}
}
